﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace PFC.Program.Profile.Pages
{
    /// <summary>
    /// Логика взаимодействия для ListExpenses.xaml
    /// </summary>
    /// 

    /* Класс со свойствами для передачи данных транизакции в кастомный ListBox */
    public class DataExpenses
    {
        public string Category { get; set; }
        public int Sum { get; set; }
        public string Description { get; set; }
        public string Date { get; set; }

        // Создание временного списка для поиска 
        public static List<object> tempItems = new List<object>();
    }

    public partial class ListExpenses : Page
    {
        public int[] arrayCategoryIDs;

        public ListExpenses()
        {
            InitializeComponent();

            /* Вывод информации о расходах */
            SqlDataReader readerInformation = ClassRequests.GetInfo_AboutExpTxs(GlobalVaribles.selectWallet);

            while (readerInformation.Read())
            {
                listExpenses_Lbx.Items.Add(
                    new DataExpenses()
                    {
                        Category = readerInformation["name"].ToString(),
                        Sum = Convert.ToInt32(readerInformation["sum"]),
                        Description = readerInformation["description"].ToString(),
                        Date = readerInformation["date"].ToString(),
                    });
            }
            readerInformation.Close();
            CommonClass.GetConnection().Close();

            // Передача кол-ва категорий
            SqlDataReader readerCountCtg = ClassRequests.GetCountCategories();
            while (readerCountCtg.Read()) { arrayCategoryIDs = new int[Convert.ToInt32(readerCountCtg["amount"])]; }
            readerCountCtg.Close();
            CommonClass.GetConnection().Close();

            // Передача ID значений категорий в массив
            SqlDataReader readerIDCtg = ClassRequests.GetCategoriesID();
            int i = 0; // итерация
            while (readerIDCtg.Read()) { arrayCategoryIDs[i] = Convert.ToInt32(readerIDCtg["catTx_id"]); i++; }
            readerIDCtg.Close();
            CommonClass.GetConnection().Close();

            /* Передача значений категорий в ComboBox */
            SqlDataReader readerExpenses = ClassRequests.GetInfo_FromCategoryTx();
            List<string> categories = new List<string>();

            while (readerExpenses.Read())
                categories.Add(readerExpenses["name"].ToString());

            readerExpenses.Close();
            CommonClass.GetConnection().Close();

            searchCateg_Cbx.ItemsSource = categories;
        }

        /* Возврат назад */
        private void back_Btn_Click(object sender, RoutedEventArgs e)
        {
            this.NavigationService.Navigate(new Main());
        }

        /* Метод поиска через поле TextBox */
        private void searchDesc_Txb_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (searchDesc_Txb.Text.Length > 0)
            {
                SqlDataReader reader = ClassRequests.GetInfo_AboutExpTxs(GlobalVaribles.selectWallet); 
                while (reader.Read())
                {
                    string desc = reader["description"].ToString();

                    // Поиск совпадений. Если есть, то передаем 1, иначе 0
                    int matches = Regex.Match(desc.ToLower(), searchDesc_Txb.Text.ToLower()).Length;

                    // Если 1, то создаем новый Item
                    if (matches > 0)
                    {
                        DataExpenses.tempItems.Add(
                        new DataExpenses()
                        {
                            Category = reader["name"].ToString(),
                            Sum = Convert.ToInt32(reader["sum"]),
                            Description = reader["description"].ToString(),
                            Date = reader["date"].ToString(),
                        });

                        reader.Close();
                        CommonClass.GetConnection().Close();

                        // Очистка ListBox 
                        listExpenses_Lbx.ItemsSource = null;
                        listExpenses_Lbx.Items.Clear();

                        // Передача новых Items`s в ListBox 
                        foreach (var item in DataExpenses.tempItems)
                            listExpenses_Lbx.Items.Add(item);

                        DataExpenses.tempItems.Clear();

                        return;
                    }
                }
            }

            // Если TextBox пуст, то возвращаем все как было
            listExpenses_Lbx.ItemsSource = null;
            listExpenses_Lbx.Items.Clear();

            SqlDataReader readerInformation = ClassRequests.GetInfo_AboutExpTxs(GlobalVaribles.selectWallet);

            while (readerInformation.Read())
            {
                listExpenses_Lbx.Items.Add(
                    new DataExpenses()
                    {
                        Category = readerInformation["name"].ToString(),
                        Sum = Convert.ToInt32(readerInformation["sum"]),
                        Description = readerInformation["description"].ToString(),
                        Date = readerInformation["date"].ToString(),
                    });
            }
            readerInformation.Close();
            CommonClass.GetConnection().Close();
           

        }

        /* Метод поиска через ComboBox */
        private void searchCateg_Cbx_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (searchCateg_Cbx.SelectedIndex == -1) return;

            int index = arrayCategoryIDs[searchCateg_Cbx.SelectedIndex];

            // Передача reader'a
            SqlDataReader reader = ClassRequests.GetReaderCbx_ExpTxs(index);

            while (reader.Read())
            {
                DataExpenses.tempItems.Add(
                        new DataExpenses()
                        {
                            Category = reader["name"].ToString(),
                            Sum = Convert.ToInt32(reader["sum"]),
                            Description = reader["description"].ToString(),
                            Date = reader["date"].ToString(),
                        });
            }

            // Очистка ListBox 
            listExpenses_Lbx.ItemsSource = null;
            listExpenses_Lbx.Items.Clear();

            // Передача новых Items`s в ListBox 
            foreach (var item in DataExpenses.tempItems)
                listExpenses_Lbx.Items.Add(item);

            DataExpenses.tempItems.Clear();

            reader.Close();
            CommonClass.GetConnection().Close();
        }

        /* Метод сброса действий с поиском TextBox и ComboBox */
        private void clean_Btn_Click(object sender, RoutedEventArgs e)
        {
            
            searchCateg_Cbx.SelectedIndex = -1;
            searchDesc_Txb.Text = "";

            // Очистка ListBox 
            listExpenses_Lbx.ItemsSource = null;
            listExpenses_Lbx.Items.Clear();

            // Восстановление списка
            SqlDataReader readerInformation = ClassRequests.GetInfo_AboutExpTxs(GlobalVaribles.selectWallet);

            while (readerInformation.Read())
            {
                listExpenses_Lbx.Items.Add(
                    new DataExpenses()
                    {
                        Category = readerInformation["name"].ToString(),
                        Sum = Convert.ToInt32(readerInformation["sum"]),
                        Description = readerInformation["description"].ToString(),
                        Date = readerInformation["date"].ToString(),
                    });
            }
            readerInformation.Close();
            CommonClass.GetConnection().Close();
            
        }    
    }
}
